package cn.itsource.hrm.service.impl;

import cn.itsource.hrm.domain.CourseType;
import cn.itsource.hrm.dto.CourseTypeView;
import cn.itsource.hrm.mapper.CourseTypeMapper;
import cn.itsource.hrm.service.ICourseTypeService;
import cn.itsource.hrm.util.ValidUtils;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.swing.text.ComponentView;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author xqf
 * @since 2021-01-14
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {
    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;

    //查询课程类型树
    @Override
    @Cacheable(cacheNames = "course", key = "'type'")
    public List<CourseType> treeData() {
        //如果Redis中没有，去数据库查询
        return findCourseTypeTree();
    }


    @Override
    @CacheEvict(cacheNames = "course", key = "'type'")
    public boolean updateById(CourseType entity) {
        return super.updateById(entity);
    }

    @Override
    @CacheEvict(cacheNames = "course", key = "'type'")
    public boolean insert(CourseType entity) {
        return super.insert(entity);
    }

    @Override
    @CacheEvict(cacheNames = "course", key = "'type'")
    public boolean deleteById(Serializable id) {
        return super.deleteById(id);
    }


    private List<CourseType> findCourseTypeTree() {
        //1.查询所有课程类型数据
        List<CourseType> courseTypes = baseMapper.selectList(null);
        List<CourseType> firstTypes = new ArrayList<>();
        //2.遍历拿到所有的一级课程
        courseTypes.forEach(courseType -> {
            if (courseType.getPid().longValue() == 0 || courseType.getPid() == null) {
                firstTypes.add(courseType);
            } else {
                //3.遍历查询所有的上一级课程
                for (CourseType parentCourseType : courseTypes) {
                    if (courseType.getPid().longValue() == parentCourseType.getId().longValue()) {
                        parentCourseType.getChildren().add(courseType);
                        break;
                    }
                }
            }
        });
        return firstTypes;
    }

    //查询面包屑
    @Override
    @Cacheable(cacheNames = "course", key = "#courseTypeId")
    public List<CourseTypeView> crumbs(Long courseTypeId) {
        //1.检验参数
        ValidUtils.isNotNull(courseTypeId, "id格式不正确");
        //2.根据typeId查询对应的对象
        CourseType courseType = baseMapper.selectById(courseTypeId);
        ValidUtils.isNotNull(courseType, "课程类型不存在");
        //3.获取path
        String path = courseType.getPath();
        String[] paths = path.split("\\.");
        List<String> strings = Arrays.asList(paths);
        //4.批量查询课程类型
        List<CourseType> courseTypes = baseMapper.selectBatchIds(strings);
        //创建一个集合封装数据
        ArrayList<CourseTypeView> list = new ArrayList<>();
        //5.遍历课程类型
        courseTypes.forEach(ownType -> {
            CourseTypeView courseTypeView = new CourseTypeView();
            courseTypeView.setOwnerCourseType(ownType);
            //获取pid，根据pid相同查询同级列表
            List<CourseType> others = baseMapper.selectByPid(ownType.getPid());
            //排除自身
           others.remove(ownType);
            courseTypeView.setOtherCourseTypes(others);
            //添加到集合中
            list.add(courseTypeView);
        });
        return list;
    }
   /* public List<CourseType> treeData2() {
        //1.查询所有课程类型数据
        List<CourseType> courseTypes = baseMapper.selectList(null);
        List<CourseType> firstTypes = new ArrayList<>();
        Map<Long,CourseType> map = new HashMap<>();
        courseTypes.forEach(courseType->{
                map.put(courseType.getId(), courseType);
                });
                //2.遍历拿到所有的一级课程
        courseTypes.forEach(courseType -> {
            if(courseType.getPid().longValue()==0 || courseType.getPid()==null){
                firstTypes.add(courseType);
            }else {
                //3.遍历查询所有的上一级课程
                CourseType parent = map.get(courseType.getPid());
                parent.getChildren().add(courseType);
            }
        });
        return firstTypes  ;
    }*/
 /*  public List<CourseType> treeData3() {
       //1.从Redis查询数据
       List<CourseType> courseTypes = (List<CourseType>) redisTemplate.opsForValue().get(RedisCourseTypeConstants.COURSE_TYPE);
       //2.判断Redis中是否有值
       if(courseTypes!=null){
           return courseTypes;
       }
       //3.如果Redis中没有，去数据库查询
       List<CourseType> courseTypeTree = findCourseTypeTree();
       //4.放入Redis中
       redisTemplate.opsForValue().set(RedisCourseTypeConstants.COURSE_TYPE, courseTypeTree);
       return courseTypeTree;
   }*/
}
